#include "widget.h"
#include "ui_widget.h"
#include <QRect>
#include <QDebug>
#include <QPixmap>
#include <QResizeEvent>

void QLabelTextFormatTest(Ui::Widget* ui) {
   // 把第一个label设置成纯文本
   ui->label->setTextFormat(Qt::PlainText);
   ui->label->setText("# 这是一段纯文本");

   //把第二个label设置成显示富文本
   ui->label_2->setTextFormat(Qt::RichText);
   ui->label->setText("<b>这是一段富文本</b>");

   //把第三个 label设置成显示 markdown
   ui->label_3->setTextFormat(Qt::MarkdownText);
   ui->label_3->setText("# 这是一段纯文本");
}

void QLabelSetImage(Ui::Widget* ui, Widget* Pthis) {
    //先把QLabel设置成和窗口一样大，并且把这个QLabel左上角设置到窗口的左上角这里
    //让整个 QLabel 铺满整个窗口
    QRect windowRect = Pthis->geometry();

    ui->label_4->setGeometry(0, 0, windowRect.width(), windowRect.height());

    QPixmap pixmap(":/image/huaji.png");
    ui->label_4->setPixmap(pixmap);
    //启动自动拉伸。此时图片就能够填充满整个窗口了
    ui->label_4->setScaledContents(true);
}

void QLabelAttribute(Ui::Widget* ui) {
    //设置对齐方式,竖直和水平居中对齐
    ui->label_5->setText("这是一段文本");
    ui->label_5->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

    ui->label_6->setText("很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本");
    //设置自动换行
    ui->label_6->setWordWrap(true);

    ui->label_7->setText("很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本");
    ui->label_7->setWordWrap(true);
    //设置缩进,相当于左边空余50个像素
    ui->label_7->setIndent(50);

    ui->label_8->setText("很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本很长的一段文本");
    ui->label_8->setWordWrap(true);
    //设置边距,相当于四边空余20个像素,这个有可能导致显示的问题
    ui->label_8->setMargin(20);
}

void QLabelShortcut(Ui::Widget* ui) {
    //此处把 label 中的文本设置为 "快捷键 &A" 这样的形式
    //其中 & 后面跟着的字符, 就是快捷键
    //可以通过 alt + A 的方式来触发该快捷键
    //但是注意, 这里的快捷键和 QPushButton 的不同. 需要搭配 alt 和 单个字母的方式才能触发
    ui->label_9->setBuddy(ui->radioButton);
    ui->label_10->setBuddy(ui->radioButton_2);
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabelTextFormatTest(ui);
    //QLabelSetImage(ui, this);
    QLabelAttribute(ui);
    QLabelShortcut(ui);
}

Widget::~Widget()
{
    delete ui;
}

//此处的形参 event 是非常有用的，这里就包含了触发这个resize 事件这一时刻，窗口的尺寸的数值
//事件函数,是进行重写的
//此处的 resizeEvent 函数我们没有手动调用, 但是能在窗口大小变化时被自动调用.
//这个过程就是依赖 C++ 中的多态来实现的. Qt 框架内部管理着 QWidget 对象表示咱们的窗口. 在窗口大小发生改变时, Qt 就会自动调用 resizeEvent 函数
//但是由于实际上这个表示窗口的并非是 QWidget, 而是 QWidget 的子类, 也就是咱们自己写
//的 Widget. 此时虽然是通过父类调用函数, 但是实际上执行的是子类的函数(也就是我们重写后的 resizeEvent ).
//此处属于是 多态 机制的一种经典用法. 通过上述过程, 就可以把自定义的代码, 插入到框架内部执行. 相当于 "注册回调函数"
void Widget::resizeEvent(QResizeEvent *event)
{
  qDebug() << event;
  ui->label_4->setGeometry(0, 0, event->size().width(), event->size().height());
}

